JavaScript 承诺链,提取不按顺序

javascript promise chain with fetch not in sequence

提问人:Tobias Wollgam 提问时间:1/13/2023 最后编辑:PhilTobias Wollgam 更新时间:1/13/2023 访问量:61

问:

我想动态地构建一个承诺链,它应该在后台做事。主要是它应该在网页上做一些输出。

这在我把承诺放到链条中之前一直有效。这些承诺没有按预期的顺序执行。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,但 的调用已经延迟。requestOutputprocessResponse

我可以更改哪些内容,以便所有步骤都按所需顺序执行?

JavaScript Promise 序列 Fetch-API

评论

0赞 Phil 1/13/2023
您使用 promise 的方式不正确。该方法接受函数,而不是实例actionOutput.then()Promise
0赞 Adam Jenkins 1/13/2023
你为什么要创造一个当时从未解决的承诺?

答:

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
感谢您快速而简单的回答。这很有帮助!