【问题标题】:worklight 5.0.6 JsonRestStore, use of Promisesworklight 5.0.6 JsonRestStore,Promises 的使用
【发布时间】:2013-04-09 11:50:29
【问题描述】:

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

上下文:

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

someFunction.then( 
             successCallback,
             errorCallback,
             optionalProgressCallback);

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

正如 cmets 和 answers 所述,这两种方法似乎实际上是相同的。

我的困惑是JQuery documentation 声明 then() 返回一个“新承诺”。

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

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

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

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

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

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

感谢 cnandreu:关键点是“错误会沿着承诺链传播,直到找到错误处理程序。”答案是explained nicely here

【问题讨论】:

  • 两段代码的作用相同。
  • @Manolo,功能上我同意,它有效。但实际上发生了什么?不知何故 p1.then(good, error) 与 p1.fail(error) 和 p2.fail(error) 具有相同的效果,p1 和 p2 显然相关 - 如何?

标签: jquery ibm-mobilefirst deferred jsonstore


【解决方案1】:
var p1 = someFunction();
var p2 = p1.then(successCallback);
p2.fail(errorCallback);

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

Promises 是一种处理异步代码的方式,这里有一个 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, etc.] 失败回调, 作为 .then 的第二个参数或第一个参数传递 of .fail 返回一个错误对象,[...]

来自JSONStore Documentation。该文档是针对 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 示例都应按预期工作。请使用文档中的真实引用和一个表明文档错误的真实示例来更新您的问题,我将更新我的答案。如果发现有什么问题错误的,我会尽一切可能去修复它。

【讨论】:

  • 谢谢,我同意 WL 文档很好,我理解 then() 的错误。相应地调整了问题。
  • 不确定是否是您要查找的内容,但我更新了答案。
  • 如此接近……关键是 p1.then(good, fail) 与 p1 相关。我们正在有效地编写 p1.fail()。但是 p1.then() 返回一个新的承诺:p2。当我们编写 p1.then().fail() 时,我们实际上是在编写 p2.fail() 而不是 p1.fail(),但一切正常。不知何故 p2.fail() 和 p1.fail() 具有相同的效果,即使它们是单独的承诺(我认为它们并不是真正“单独的” - 但我无法解释发生了什么,)
  • 我认为this article 可能会有所帮助。在“错误处理”下:“因为 Promise 知道它们是否已完成或失败,它们可以传播错误,在遇到错误处理程序之前不会调用任何回调。”
  • 是的,这是我理解的关键缺失部分。非常感谢您找到它。
【解决方案2】:

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

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

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

【讨论】:

  • 但这就是重点,那里确实有两个不同的字符串:str 和 strTrimmed。当我们执行 xxx().then().fail() 时,我们有两个明显不同的 promise:由 xxx() 返回的 p1 和由 then() 返回的 p2。如果我们编写 p1.then(good, bad) 代码,我们将 bad 与 p1 相关联。如果我们编写 p1.then(good).fail(bad) 代码,我们将把 p2 与 bad 联系起来。但不知何故,它具有相同的效果。
猜你喜欢
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
相关资源
最近更新 更多