JQuery立即推迟拒绝

使用JQuery.Deferred时可以直接调用reject()吗? 没有调用异步函数?

也许我想在异步函数的开头进行某种测试。 如果测试失败,我想立即拒绝。 请参阅下面的第一个if块。

function doSomethingAsync() { //Test if the ajax call should be invoked var testFailed = true; var dfd = $.Deferred(); //Check if test failed if (testFailed) { var asyncResult = { success: false, data: 'test failed' }; //Is this OK usage of reject on the same thread? dfd.reject(asyncResult); return dfd.promise(); } $.get('/api/testapi/get').done(function (data) { var asyncResult = { success: true, data: data }; dfd.resolve(asyncResult); }).fail(function (err) { var asyncResult = { success: false, data: err }; dfd.reject(asyncResult); }); return dfd.promise(); } 

使用JQuery.Deferred时可以直接调用reject()吗? 没有调用异步函数?

是的,完全可以返回已被拒绝的承诺,并立即拒绝延期。 您可能只需要validation您的回调不依赖于异步解析,jQuery不保证(与A +实现相反)。

请注意,在您的代码中,您应该使用then而不是手动解析延迟:

 function doSomethingAsync() { var testFailed = /* Test if the ajax call should be invoked */; var dfd = testFailed ? $.Deferred().reject('test failed') : $.get('/api/testapi/get'); return dfd.then(function (data) { return { success: true, data: data }; }, function (err) { return { success: false, data: err }; }); }