提问人:Tobias Wollgam 提问时间:1/13/2023 最后编辑:PhilTobias Wollgam 更新时间:1/13/2023 访问量:61
JavaScript 承诺链,提取不按顺序
javascript promise chain with fetch not in sequence
问:
我想动态地构建一个承诺链,它应该在后台做事。主要是它应该在网页上做一些输出。
这在我把承诺放到链条中之前一直有效。这些承诺没有按预期的顺序执行。fetch
以下示例演示了如何构建链:
var chain = Promise.resolve();
for(var i = 0; i < actions.length; ++i)
chain = actions[i].extendChain(chain);
function actionExample(chain) {
return chain.then(...);
}
这适用于直接输出:
function actionOutput(chain) {
return chain.then(new Promise(resolve => {
print('text');
resolve();
}));
}
但是 fetch 或不是按顺序排列的:
function actionLoad(chain) {
const url = '...';
return chain.then(new Promise(() => print('run action load\n')))
.then(() => fetch(url))
.then((response) => response.json())
.then(processResponse)
.then(requestOutput)
.then(receiveOutput);
}
该函数还包含一个 fetch,但 的调用已经延迟。requestOutput
processResponse
我可以更改哪些内容,以便所有步骤都按所需顺序执行?
答:
1赞
Phil
1/13/2023
#1
绝对没有理由在这里创造新的承诺。将实例传递给也是不正确的,因为它需要一个或两个函数。Promise
.then()
该方法始终返回一个新承诺,该承诺使用提供的函数的返回值进行解析.then()
function actionOutput(chain) {
return chain.then(() => print('text'));
}
function actionLoad(chain) {
const url = '...';
return chain
.then(() => print('run action load\n')) // resolves with return value of
// `print()`, probably `undefined`
.then(() => fetch(url))
.then((response) => response.ok ? response.json() : Promise.reject(res))
.then(processResponse)
.then(requestOutput)
.then(receiveOutput);
}
评论
0赞
Tobias Wollgam
1/13/2023
感谢您快速而简单的回答。这很有帮助!
评论
actionOutput
.then()
Promise