鍍金池/ 問(wèn)答/HTML/ for循環(huán)中請(qǐng)求數(shù)據(jù)接口

for循環(huán)中請(qǐng)求數(shù)據(jù)接口

for循環(huán)請(qǐng)求數(shù)據(jù)接口,for循環(huán)出不同的值,作為請(qǐng)求接口的參數(shù)。這種請(qǐng)情況怎么處理?否則接口還沒(méi)請(qǐng)求完成,for循環(huán)就已經(jīng)執(zhí)行完了

clipboard.png

回答
編輯回答
念舊

先存數(shù)組,然后每一個(gè)元素是一個(gè)promise,然后通過(guò)promise.all來(lái)調(diào)用,then的時(shí)候返回的是一個(gè)一一對(duì)應(yīng)的結(jié)果數(shù)組

2017年7月30日 23:46
編輯回答
茍活

關(guān)于對(duì)異步處理的理解,可以參考從小小題目逐步走進(jìn) JavaScript 異步調(diào)用

// 如果你用 node 的話,可以用 util.promisify 來(lái)封裝 node 回調(diào)風(fēng)格調(diào)用
// 或者就自己寫(xiě)一個(gè)
function updateTaskLastMile(...args) {
    return new Promise((resolve, reject) => {
        taskMainRepo.updatetasklastmile(...args, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        });
    });
}

async function main() {
    const bb = [];
    const promises = bb.map(b => updateTaskLastMile(b));

    // 這個(gè) aa 就是你想要的
    const aa = await Promise.all(promises);
}

但是上面這個(gè) main 必須要每個(gè) bb 的調(diào)用都成功才會(huì)返回也就是說(shuō),對(duì)于 Promise.all,如果有一個(gè)失敗,必定全部失敗。那么可以這樣改寫(xiě)(參閱從不用 try-catch 實(shí)現(xiàn)的 async/await 語(yǔ)法說(shuō)錯(cuò)誤處理):


async function main() {
    const bb = [];
    // 注意這里加的 .catch
    const promises = bb.map(b => updateTaskLastMile(b).catch(err => false));

    // 這個(gè) aa 就是你想要的
    const aa = await Promise.all(promises);
}

這樣,如果有調(diào)用失敗,aa 中對(duì)應(yīng)的元素就是 false,當(dāng)然你也可以使用其它容易識(shí)別的值,比如 nullundefined 或者某個(gè)特殊值,甚至可以干脆對(duì)返回值進(jìn)行一次封裝

    const promises = bb
        .map(b => updateTaskLastMile(b)
            .then(data => ({ data }), err => ({ err })));

這樣,aa 中的每個(gè)元素都是一個(gè)對(duì)象,要么有 data 屬性,要么有 err 屬性……

2017年9月20日 03:33
編輯回答
笑浮塵

異步請(qǐng)使用promise

2018年4月10日 16:46
編輯回答
我不懂

方法一:let i=0
方法二:

  for(var i=0;i<bb.length;i++){
     (function (arg) {
            aa.push(
              {
                text: http.....bb[arg]
              }
            )
            })(i);
     }

1.簡(jiǎn)單點(diǎn)使用es6的let解決。
2.不支持es6的話用閉包。

2017年9月27日 16:43
編輯回答
凝雅

老生常談的閉包問(wèn)題

2017年10月10日 10:26