一個更新的程式,分成兩個檔案
一個檢查,一個下載
原本下載都會不完全,加了timeout之後就好了,
有人可以解釋為什麼嗎?
code 如下
check檔
function check() {
return new Promise((resolve) => {
request( url , function(err, res, body) {
var obj = JSON.parse(body);
if( obj.url != null || obj.url != undefined) {
resolve({url:data.url , name:obj.url});
}else {
resolve(null);
}
});
});
}
async function method() {
var dat = await check();
if( dat ) {
setTimeout(() => {
download(dat.url, dat.name);
}, 1500)
}
}
download檔
module.exports = function(url,filename) {
request(url)
.pipe(fs.createWriteStream(filename))
.on('close', function () {
console.log('File written!');
});
}
他有說了下載zip,這讓我猜測可能一件事。
就是它的zip有可能是在更新檢查時才開始建立zip檔。
然後要馬上按下載。
但zip建立是需要時間的。所以有很大的可能性會下載到不完全的zip。
一般要避免該情況。我大多是建立zip時會先放到temp檔上。等建立完全後才會移到正式的位置下載。
不過會發生這樣的情況是要如我說的,更新檢查時才建立zip的情況。該問題才會成立。
如果是早就建好的zip放在那邊下載不完全。我就猜不到原因了。
哦哦謝謝你,我的確是這樣做,以後我會把流程說明清楚
那我也可以建立完再回傳嗎?
另外,他程式裡看起來完全不處理錯誤或異常...(也許是沒貼出來?)
我會建議要處理reject的狀況,他的Promise只處理resolve。其中request的callback第一個丟進來的參數是error,這個要最先處理的,不然錯誤都發生了程式還繼續跑...
然後可以用
var dat = await check().catch(e=>console.error(e.message));
來處理async function裡面發生的例外等等。
在stream裡可以用事件監控接收過程,這樣也可以比較容易確定問題發生的時機。
這些都是簡單地自己檢查問題的技巧,只是有沒有做。
感覺你的 code 好像哪裡怪怪的
resolve({url:data.url , name:obj.url});
其中的 data.url 是從哪裡來的?
然後你用 request 去做你所謂的 check
這樣不會等同於多下載一次嗎?
還是我誤會了什麼
上面還有一串引入data.url從那裡引入的,check是去跟另一端確認版本,需要再更新。
@ms0369033
喔喔
所以也就是說 check 跟 download 的 url 不一樣就是了
不過我剛單獨測你寫的 download.js
把 settimeout 拿掉
就算是下載 1G 多的 android studio
也沒有發生你說的情況
估計你的問題應該是別的地方造成的