如何使代码在继续嵌套承诺之前等待响应?



我有一些类似下面的代码:

functionA (list) {
list.forEach(fucntion (item) {
functionB(item);
});
}
functionB (item) {
// format data
service.init(item) // first promise
.then(function (data) {
// error handle
(functionC (randomStuff) {
// error handle
service.getResponse(data) // second promise
.then(function (response) {
// this is the response value I need to pass back
})
})()
}
})

我需要在开始时使forEach循环发送一个项目并等待响应,然后再继续处理列表中的下一个项目。你知道我该怎么做吗?

您可以使用asyncawait关键字使您的函数异步,因此您可以在函数内同步解析承诺:

async functionB(item) {
var data = await service.init(item);
(async functionC(randomStuff) {
var response = await service.getResponse(data);
return response;
})();
}

文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

从你的问题推断,每个异步函数调用都依赖于前一个调用的结果,你可以在for循环中创建一个承诺链,像这样…

function functionA(list) {
let promiseChain = Promise.resolve();
list.forEach(item => {
promiseChain = promiseChain.then(result => {
return functionB(item, result);
});
});
return promiseChain;
}
像这样按顺序链接的一个原因是,每次调用异步函数都需要上次调用的结果。所以这里,functionB接受当前项和先前的结果。
// this function must work when priorResult == null, as it will be on the first invocation
function functionB(item, priorResult) {
return service.init(item).then(data => { // note the returns, which are missing in the OP pseudo-code
return service.getResponse(data);
});
}

您可以使用for of循环来完成functionAasyncawait的工作。

(async function functionA(list) {
try {
for (const item of list) {
const response = await functionB(item);
//do something with response...
console.log(response);
}
} catch (err) {
console.log(err);
}
})(list);
async function functionB(item) {
try {
const randomStuff = "test";
const data = await service.init(item);
const response = await functionC(randomStuff)(data);
return response;
} catch (err) {
throw err;
}
}
function functionC(randomStuff) {
return async data => {
try {
const response = await service.getResponse(data); // second promise
return response;
} catch (err) {
throw err;
}
};
}

相关内容

  • 没有找到相关文章

最新更新