gpt4 book ai didi

javascript - 在 JavaScript 中,如何在超时时包装 promise ?

转载 作者:可可西里 更新时间:2023-11-01 01:18:34 24 4
gpt4 key购买 nike

使用 deffered/promise 实现一些异步函数的超时是一种常见的模式:

// Create a Deferred and return its Promise
function timeout(funct, args, time) {
var dfd = new jQuery.Deferred();

// execute asynchronous code
funct.apply(null, args);

// When the asynchronous code is completed, resolve the Deferred:
dfd.resolve('success');

setTimeout(function() {
dfd.reject('sorry');
}, time);
return dfd.promise();
}

现在我们可以执行一些名为 myFunc 的异步函数并处理超时:

// Attach a done and fail handler for the asyncEvent
$.when( timeout(myFunc, [some_args], 1000) ).then(
function(status) {
alert( status + ', things are going well' );
},
function(status) {
alert( status + ', you fail this time' );
}
);

好吧,让我们来扭转一下这个故事吧!想象一下 myFunc 本身返回一个 promise (注意: promise 不会延迟,我无法更改它):

function myFunc(){
var dfd = new jQuery.Deffered();
superImportantLibrary.doSomething(function(data)){
if(data.length < 5){
dfd.reject('too few data');
}
else{
dfd.resolve('success!');
}
}, {'error_callback': function(){
dfd.reject("there was something wrong but it wasn't timeout");}
}});
return dfd.promise();
}

现在,如果我将 myFunc 包装在 timeout 中,我将失去处理与超时不同的错误的能力。如果 myFunc 发出进度事件,我也会松开它。

所以问题是:如何修改 timeout 函数,以便它可以接受函数返回 promises 而不会丢失它们的错误/进度信息?

最佳答案

function timeout(funct, args, time) {
var deferred = new jQuery.Deferred(),
promise = funct.apply(null, args);

if (promise) {
$.when(promise)
.done(deferred.resolve)
.fail(deferred.reject)
.progress(deferred.notify);
}

setTimeout(function() {
deferred.reject();
}, time);

return deferred.promise();
}

关于javascript - 在 JavaScript 中,如何在超时时包装 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24183480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com