这最初是关于Worklight文档的问题,我发现我真正的问题是关于JQuery的Deferred / Promise API和promise.then()函数。
上下文:
5.0.6 JsonRestStore API的文档提供了使用新Promise功能的示例,提供了两种可能的配方。
someFunction.then(
successCallback,
errorCallback,
optionalProgressCallback);
和
someFunction().then(successCallback).fail(errorCallback)
正如评论和答案所述,这两种方法看起来实际上是相同的。
我的疑问是,JQuery documentation表示then()返回“新承诺”。
因此,在第二种情况下,我们正在编码:
var p1 = someFunction();
var p2 = p1.then(successCallback);
p2.fail(errorCallback);
我也看到人们建立了这样的行动“链”:
someFunction().then(action2).then(action3).then(action4);
设置一系列异步操作。所以我的问题变成了上面例子中承诺p1和p2之间的关系。这与连锁理念有何关系?
---编辑引用答案---
感谢cnandreu:关键是“错误沿着promise链传播,直到找到错误处理程序。”答案是explained nicely here。
答案 0 :(得分:4)
var p1 = someFunction();
var p2 = p1.then(successCallback);
p2.fail(errorCallback);
所以我的问题变成了承诺之间的关系 上例中的p1和p2。这与链条有什么关系? 想法?
Promise是一种处理异步代码的方法,这里有quick video和article来解释它们。 someFunction()
将执行异步任务,当它完成时(即获取resolved)它执行successCallback
,如果失败(即rejected),它将执行errorCallback
。关系是p2
是仅在p1
获得rejected时才会执行的承诺。将p1.then(win, fail)
和p1.then(win).fail(fail)
视为编写相同内容的两种方式。
最初的问题可能是指以下内容:
来自JSONStore Documentation的在JSONStore异步操作之后返回promise对象 被调用(查找,添加,删除等)。 [...] [JSONStore.add,JSONStore.find等]失败回调, 作为.then的第二个参数或第一个参数传递 of .fail返回一个错误对象,[...]
。该文档特定于JSONStore API,我们将读者引用到jQuery文档以了解promises如何工作(请参阅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示例都应按预期工作。请通过文档中的真实引用更新您的问题,并提供一个显示文档错误的真实示例,我将更新我的答案。如果事实证明 错误,我会尽一切可能来解决它。
答案 1 :(得分:0)
它们在功能上是一样的,这基本上是链接如何工作的吗?您有两个选择,要么获取一个调用的输出,又将其链接到下一个调用,或者您可以将结果保存在命名变量中,然后在该命名变量上调用下一个操作。
var str = " fooo ";
str.trim().indexOf('f');
与
var str = " fooo ";
var strTrimmed = str.trim()
strTrimmed.indexOf('f');