0

这最初是关于 Worklight 文档的问题,它表明我真正的问题是关于 JQuery 的 Deferred/Promise API 和 promise.then() 函数。

语境:

5.0.6 JsonRestStore API的文档提供了使用新 Promise 功能的示例,提供了两种可能的公式。

someFunction.then( 
             successCallback,
             errorCallback,
             optionalProgressCallback);

 someFunction().then(successCallback).fail(errorCallback)

正如评论和答案所述,这两种方法似乎实际上是相同的。

我的困惑是JQuery 文档指出 then() 返回一个“新承诺”。

因此在第二种情况下,我们正在编码:

  var p1 = someFunction();
  var p2 = p1.then(successCallback);
  p2.fail(errorCallback);

我还看到人们设置了这样的“链”动作:

  someFunction().then(action2).then(action3).then(action4);

设置异步操作链。所以我的问题变成了上面示例中的承诺 p1 和 p2 之间的关系是什么。这与连锁理念有什么关系?

---编辑以参考答案---

感谢 cnandreu:关键点是“错误会沿着承诺链传播,直到找到错误处理程序。” 答案在这里得到了很好的解释

4

2 回答 2

4
var p1 = someFunction();
var p2 = p1.then(successCallback);
p2.fail(errorCallback);

所以我的问题变成了上面示例中的承诺 p1 和 p2 之间的关系是什么。这与连锁理念有什么关系?

Promise 是一种处理异步代码的方式,这里有一个简短的视频文章来解释它们。someFunction()将执行一个异步任务,当它完成时(即被解决)它执行successCallback,如果失败(即被拒绝)它执行errorCallback. 这种关系是p2一个承诺,只有在p1拒绝时才会执行。把p1.then(win, fail)和想象p1.then(win).fail(fail)成写同一件事的两种方式。

最初的问题可能是指以下内容:

在调用 JSONStore 异步操作(查找、添加、删除等)后返回一个 Promise 对象。[...] [JSONStore.add, JSONStore.find, etc.] 失败回调,作为 .then 的第二个参数或 .fail 的第一个参数传递,返回一个错误对象,[...]

来自JSONStore 文档。该文档是特定于 JSONStore API 的,我们建议读者参考 jQuery 文档以了解 Promise 的一般工作方式(有关更多详细信息,请参阅 jQuery 的 API 文档。)。

这是一个例子:

var collections = {
        people : {
            searchFields : {name: 'THIS_SHOULD_PRODUCE_AN_ERROR'}
        }
    };

WL.JSONStore.init(collections)

.then(function(res){
    //the code here should not be called because we expect to fail
    console.log(typeof res === 'object' ? JSON.stringify(res) : res);
})

.fail(function(err){
    console.log(err.toString());
});

输出是:

{"src":"initCollection","err":-12,"msg":"INVALID_SEARCH_FIELD_TYPES","col":"people","usr":"jsonstore","doc":{},"res":{}}

如果我们切换到.then(success, failure)

var collections = {
        people : {
            searchFields : {name: 'THIS_SHOULD_PRODUCE_AN_ERROR'}
        }
    };

var success = function(res){
    //the code here should not be called because we expect to fail
    console.log(typeof res === 'object' ? JSON.stringify(res) : res);
};

var failure = function(err){
    console.log(err.toString());
};

WL.JSONStore.init(collections).then(success, failure);

我们得到相同的输出:

{"src":"initCollection","err":-12,"msg":"INVALID_SEARCH_FIELD_TYPES","col":"people","usr":"jsonstore","doc":{},"res":{}}

混合它们,选择一个或使用已弃用的回调。文档中的所有 JSONStore 示例都应按预期工作。请使用文档中的真实引用和一个表明文档错误的真实示例来更新您的问题,我将更新我的答案。如果事实证明问题,我会尽一切可能修复它。

于 2013-04-16T23:08:55.567 回答
0

它们在功能上是相同的,这基本上就是链接的工作原理吗?您有 2 个选择,要么获取一个调用的输出,并将其链接到下一个调用,要么您可以将结果保存在命名变量中,然后对该命名变量调用下一个操作。

var str = "   fooo ";
str.trim().indexOf('f');

相对

var str = "   fooo ";
var strTrimmed = str.trim()
strTrimmed.indexOf('f');
于 2013-04-17T17:52:01.783 回答