【发布时间】:2019-09-18 21:15:51
【问题描述】:
假设我有一个搜索功能来进行 HTTP 调用。 每次通话可能需要不同的时间。 所以我需要取消最后一个HTTP请求,只等待最后一个调用
async function search(timeout){
const data = await promise(timeout)
return data;
}
// the promise function is only for visualizing an http call
function promise(timeout){
return new Promise(resolve,reject){
setTimeout(function(){
resolve()
},timeout)
}
}
search(200)
.then(function(){console.log('search1 resolved')})
.catch(function() {console.log('search1 rejected')})
search(2000)
.then(function(){console.log('search2 resolved')})
.catch(function(){console.log('search2 rejected')})
search(1000)
.then(function(){console.log('search3 resolved')})
.catch(function(){console.log('search3 rejected')})
需要查看“search1 已解决”“search2 已拒绝”“search3 已解决”
我怎样才能实现这个场景?
【问题讨论】:
-
如果你有多个 Promise 链接在一起 - 当其中一个被拒绝时链将停止。您没有将它们链接起来,因此它们每次都会执行。
-
Aksi bit rekated ti question,但你应该转向 async await 它更简单
-
这不是我想要的场景。如果尚未解决 promise 函数,我只需要取消最后一次调用 promise 函数只需可视化一个异步调用,如 API 我只想解析最后一个 promise 或在 1000 ms 之前解决的任何其他 promise
-
你的
Promise结构应该是new Promise((resolve, reject) => ...),还有,记录promise2 resolved有什么问题? -
您的问题含糊不清。如果当有新请求进入时确实应该取消最后一个承诺,那么您的代码示例应该产生“search1 denied”,而不是“search1 resolved”,因为
search的第二次调用应该将先前的承诺标识为未解决。但是,如果您想优先考虑最先解决的承诺,则输出应为“search1 resolved”,而其他两个被拒绝。请澄清您问题中的逻辑,并使代码与该解释保持一致。
标签: javascript promise cancellation