worklight 5.0.6 JsonRestStore,使用Promises

时间:2013-04-16 21:54:45

标签: jquery ibm-mobilefirst deferred jsonstore

这最初是关于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

2 个答案:

答案 0 :(得分:4)

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

所以我的问题变成了承诺之间的关系   上例中的p1和p2。这与链条有什么关系?   想法?

Promise是一种处理异步代码的方法,这里有quick videoarticle来解释它们。 someFunction()将执行异步任务,当它完成时(即获取resolved)它执行successCallback,如果失败(即rejected),它将执行errorCallback。关系是p2是仅在p1获得rejected时才会执行的承诺。将p1.then(win, fail)p1.then(win).fail(fail)视为编写相同内容的两种方式。

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

  

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

来自JSONStore Documentation

。该文档特定于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');