【问题标题】:Mixing jquery promise with Parse promises将 jquery 承诺与 Parse 承诺混合
【发布时间】:2016-10-28 03:18:24
【问题描述】:

我正在使用 jquery 发送一个 ajax 请求以执行某些任务,并根据该 jquery GET 响应的结果,我正在 Parse Js 库上执行一些操作。

例如

我已经创建了一个这样的方法来发送请求。

sendRequest(URL, userId){
    return $.ajax({
        url: URL + userId,
        type: 'GET',
    }).fail((responseData) => {
        if (responseData.responseCode) {
            console.error(responseData.responseCode);
        }
    });
}

我就是这样用的——

sendRequest(URL, userId)
.then(
       (data) => {
                   // Example
                   // Get some value from data and save it in Parse object
                    var GameScore = Parse.Object.extend("GameScore");
                    var gameScore = new GameScore();

                       gameScore.set("score", 1337);
                       gameScore.set("playerName", "Sean Plott");
                       gameScore.set("cheatMode", false);

                       return gameScore.save(); 
                 }
).then(
        (changedGameObj) => {
           console.log(changedGameObj);
           // At this point receiving a parse promise which is not resolved yet.
        },
        (error) => {
       }
);

我知道我正在混合使用 jquery promise 和 Parse promise,但不知道如何解决解析承诺,因为 jquery 承诺更早得到解决。

我对 js 的承诺很陌生,请指出我错在哪里。

【问题讨论】:

  • 您可能还会发现,对于 jQuery deferred,使用 function(data) 语法比 (data) => 效果更好。
  • 您遇到了well-known problem。不要使用 jQuery 承诺 :-)

标签: javascript jquery ajax parse-platform


【解决方案1】:

据我所知,您的承诺链是这样的(删除功能等):

$.ajax().fail().then().then(success(), error());

您可以查看 jQuery 的 deferred 的文档了解更多详细信息。

有两件事可以尝试:

1)Convert jQuery deferred to a real promise。我会这样做是因为我不想学习 jQuery 的 deferred。你可能需要在这里挖掘,所以......

Bergi 推荐:return Parse.Promise.resolve(jqueryPromise)

或

2) 将您的 Parse Promise 链接到同一个 then():

sendRequest(URL, userId)       // This is jQuery deferred
.then( (data) => {
  // ...
  return gameScore.save()      // This is a promise
  .then( (changedGameObj) => { // success
    console.log(changedGameObj);
  }, (error) => {              // error
    console.warning(error);
  });                          // this whole promise is returned to the deferred.
})
.fail()                        // Back to jquery deferred.
.always()
.whatever()  

【讨论】:

  • 是的,已经完全按照您在答案第 2 部分中所写的内容完成了。无论如何,感谢您的帮助。
  • 不要使用#2。错误处理程序不会像在 OP 中那样捕获来自 sendRequest 的任何错误。
  • @Bergi,人们可以为所欲为。我添加了一个如何进行错误处理的示例。
  • @MichaelCole 啊,当然可以,而且通常这种模式甚至是正确的模式,我只是说 OP 可能不应该使用它,因为它无法满足期望它的工作原理与他原始代码中的错误处理相同。
【解决方案2】:

根据 first 部分中 Michael 的建议,我创建了一个辅助方法来将 Jquery deferred 转换为 Parse promise。我觉得这是一种非常优雅的方式。

convertJqueryToParsePromise(jqueryPromise) {
    let promise = new Parse.Promise();

    jqueryPromise
        .then(
            (results) => {
                promise.resolve(results);
            },
            (error) => {
                promise.reject(error);
            }
        );
    return promise;
}

用法:

convertJqueryToParsePromise(sendRequest(URL, dataToSend))
.then(
       (success) => {
          // Do something here
       },
       (error) => {
       }
 );

【讨论】:

  • 好多了:return Parse.Promise.resolve(jqueryPromise).
  • @Bergi 你能解释一下这个简洁的语法吗?这将帮助我更好地理解。也许您可以发布另一个答案。非常感谢。
  • 这只是 Promise.resolve 用于将 thenables 转换为 Promise 的函数。它本质上和你的函数一样,但它被证明是正确的,你不必自己写。
猜你喜欢
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
相关资源
最近更新 更多