2016-10-21 13 views
0

私はjqueryを使用して特定のタスクを実行するajaxリクエストを送信し、そのjquery GET応答の結果に基づいてParse Jsライブラリで何らかのアクションを実行しています。Parse約束とjquery約束を混ぜる

このような方法でリクエストを送信しました。

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の約束と解析の約束を混合していますが、jQueryの約束が取得するので、どのように解決さ得るために解析約束のソリューションを知らないことを知っています先に解決されました。

私はjsで約束してくれて、私が間違っているところを指摘してください。私はあなたの約束のチェーンは、この(関数を削除、など)で見ることができるものから、

+0

また '関数(データ)を使用して'構文は(データ)=> 'jQueryのために延期 'より良い作品ということかもしれません。 –

+0

[よく知られている問題](http://stackoverflow.com/q/32475978/1048572)に遭遇しました。 jQueryの約束を使わないでください:-) – Bergi

答えて

0

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

あなたはjQueryのdeferred詳細についてのドキュメントを参照してくださいすることができます。

1)Convert jQuery deferred to a real promise

しようとする二つのことをあります。私はjQueryが延期されたことを気にしないので、私はこれをします。あなたの解析が同じthen()で一緒に約束チェーン)return Parse.Promise.resolve(jqueryPromise)

OR

2:

に基づいて
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() 
+1

はい、回答パート2で書いたことを正確に行いました。とにかく助けてくれてありがとう。 – WitVault

+0

#2は使用しないでください。エラーハンドラは、OPで行ったのと同じように 'sendRequest'からのエラーをキャッチしません。 – Bergi

+0

@Bergi、人々は好きなことをすることができます。エラー処理の方法の例を追加しました。 –

0

あなたは

がBergiによって提案...ので、ここで掘る必要があるかもしれません最初にパートの私は、Jqueryを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) => { 
     } 
); 
+0

もっと良い: 'return Parse.Promise.resolve(jqueryPromise)'。 – Bergi

+0

@Bergiあなたはこの簡潔な構文を説明できますか?それは私がはるかによく理解するのに役立ちます。あなたは別の答えを投稿することができるかもしれません。どうもありがとう。 – WitVault

+0

これはちょうど['Promise.resolve'](https://developer.mozilla。orgables/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve)を使用します。基本的にあなたの関数と同じことをしますが、正しいことが証明されており、あなた自身で書く必要はありません。 – Bergi