何时使用deferred.reject()?

use*_*108 2 jquery jquery-deferred

我对何时使用deferred.resolve()和感到非常困惑deferred.reject()

快速范例

var doSomething = function() {

    var deferred = $.Deferred();

    if ( typeof myVar === "object" ) {

        // Do something with myVar - Start.

            deferred.resolve();

        // Do something with myVar - End.

    } else {

        // myVar isn't an object, but the function has finished executing
        // and that's what I want to know.
        // With reject() I'll be forced to use always() instead of done()
        // because there'll be also a fail() method available if myVar
        // is not an object.
        deferred.reject();
    }

    return deferred.promise();
};
Run Code Online (Sandbox Code Playgroud)

关于何时应该使用deferred.reject()的任何提示或规则?

注意

myVar在某些时候具有动画效果。动画完成后,我要做一些其他事情,然后才解析Deferred对象。

jfr*_*d00 6

.resolve()并且.reject()是从你的承诺,结果两个不同的可能的分支。

虽然,这实际上取决于程序员如何最佳地使用这两种可能的路径,.resolve(data)通常用于成功的结果,并且可以选择返回具有成功结果的数据,并且.reject(err)通常用于错误条件并返回有关错误的一些信息。

您使用哪个确定.then(f1, f2)为此承诺触发了哪些回调。如果使用.resolve(),则将f1被调用(假定为成功处理程序回调)。如果使用.reject(),则将f2被调用(假设是错误处理程序回调)。


还有一些更高级别的函数可以在promise上运行,例如$.when()(在jQuery世界中)假定.resolve()成功并且.reject()是错误条件。 $.when()当所有的诺言都已解决或任何诺言被拒绝(假定为错误情况)时,将其称为回调。


如果调用代码仅真正在乎操作何时完成(无论操作是否成功完成),那么您就有三个不同的选择,而选择哪个才是您的选择:

1)您可以使用.resolve().reject()然后将完成处理程序放入一个函数中,并按如下方式调用它:

doSomething.then(doneHandler, doneHandler);
Run Code Online (Sandbox Code Playgroud)

2)你可以使用.resolve().reject()再利用.always()是这样的:

doSomething.always(...);  
Run Code Online (Sandbox Code Playgroud)

的缺点.always()是它是jQuery特定的方法,而不是promise标准,因此将来可能会更改。例如,Bluebird和Q Promise库将.finally()这种类型的功能使用。

3)您可以.resolve()同时使用这两个路径,因此无论如何完成/为什么完成,都只有一个完成处理程序。

doSomething.then(fn);
Run Code Online (Sandbox Code Playgroud)

前两个选项的优点是,在将来的某个时候,调用者可以更轻松地实现不同的行为,以成功完成而不是错误完成。

第三种选择的优点是,您可以更轻松地使用此承诺,例如$.when()了解何时完成承诺和其他一些事情。


在查看特定的代码时,应该记住,当您进行异步操作(例如ajax调用)时,promise最好被使用。如果您没有任何异步操作,那么您也可以直接从函数中返回一个值来指示成功或失败,然后让调用代码检查该错误并根据该错误进行分支。使用promise并不像用于同步活动的普通过程代码(例如您问题中的示例代码)那样简单,因此通常没有充分的理由将promise用于纯同步编码。