[英]wait for promise in loop
我得到了這個功能:
const upload = (example) => {
console.log('uploading...');
return new Promise(function (resolve, reject) {
resolve & reject
});
};
我在這里調用上面的函數:
const dirents = await fs.readdirSync(path, {withFileTypes:true});
await Promise.all(dirents.map(async (dirent) => {
await upload(example).then((response) => {
console.log('success');
}, (err) => {
console.log(err);
});
});
輸出應為
'uploading' -> 'success' -> 'uploading' ...
但這實際上是
'uploading' -> 'uploading' -> 'success' -> 'success'
我也嘗試了( for ... of
),但這對我也不起作用。
對於順序承諾,在async
函數中使用簡單的循環非常清晰易讀:
let userIDs = [1, 2, 3]; async function uploadIDS(ids) { for (let id of ids) { let res = await upload(id) console.log("Success:", res) } } const upload = (example) => { console.log('uploading...'); return new Promise(function(resolve, reject) { resolve(example) }); }; uploadIDS(userIDs)
這是一個將reduce
與async/ await
使用的現代示例(您可以在此處運行)
let userIDs = [1,2,3];
userIDs.reduce( async (previousPromise, nextID) => {
await previousPromise;
return upload(nextID).then((val) => {
console.log("success", val);
})
}, Promise.resolve());
const upload = (id) => {
console.log('uploading...', id);
return new Promise(function (resolve, reject) {
resolve(id);
});
};
**您還可以使用遞歸功能**
//const dirents = await fs.readdirSync(path, {withFileTypes:true});
const dirents = [1,2,3]
const upload = (example) => {
console.log('uploading...');
return new Promise(function (resolve, reject) {
resolve(example)
});
};
function callUpload(dirent, length, count) {
if(count >= dirents.length){
return;
}
upload(dirent).then(() => {
count += 1;
console.log("success")
callUpload(dirents[count], dirents.length, count)
})
}
callUpload(dirents[0], dirents.length, 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.