3

私はこの問いに対する答えを必死に探し、苦労してこの答えにたどり着きました。私が苦しんだ失われた時間を他の人が救ってくれることを願っています。おそらく、誰かが改善またはより良いパターンで答えるでしょう.

編集: ここに入力した以前のコード セットは置き換えられました。

このメソッドでは、コールバックのネストなしで非同期操作の複数の呼び出しを行う方法を確認できます。また、非同期コードを小さな呼び出し可能な関数に入れる方法も示しています。このメソッドは、複数レベルの深さで非同期関数を呼び出す場合にも機能します。各レベルで、複数の非同期アクションを組み合わせて、その意図を満たすことができます。エラーは行を上に渡され、一連の .then を介してバブルする可能性があります。

ログ出力は、実際に何が起こっているのかを理解するのに役立ちます。

解析と JS の初心者である私を本当に助けてくれたであろう 2 つのこと: 1) 解析 JS 操作は、promise を返すときは非同期のように見えますが、それ以外の場合はそうではありません。1 つの例外は query.get() です。2) .then 呼び出しの構文には十分注意してください。3) スローされたエラーは、.then エラー関数によってキャッチされません。エラーを発生させるには、"return Parse.Promise.error()" を使用します。4) 約束を理解するには、Mike Taulty のスクリーンキャストを見てください。簡単にググることができます。Mike に感謝します。

このコードは、Parse.com でテストされています。

function test0()
{
    console.log("test0.entry");
    var promise0 = test1("T", "col", "test1call1");

    var promise1 = promise0.then(function(ex) {
        console.log("test0.0.success - " + ex);
        return test1("T", "emailAddress", "test1call2");
    });
    var promise2 = promise1.then(function(ex) {
        console.log("test0.1.success - " + ex);
        return test2(1);
    });
    promise2.then(function(msg) {
        console.log("test0.2.success - " + msg);
        return;
    }, function(error) {
        console.log("test0.2.error " + error.message);
        return;
    });
    console.log("test0.exit");
}

function test1(clss, col, val) 
// use as a method on a save request
// returns true if the column value already exists
{
    console.log("[" + val + "]" + "test1.entry");
    var c = Parse.Object.extend(clss);
    var query = new Parse.Query(c);

    query.equalTo(col, val);
    var promise1 = query.count();
    var promise2 = promise1.then(function(count) {
        console.log("[" + val + "]" + "test1.sub.success - " + count);
        if (col == "reject") {    
            var err = new Parse.Error(10001, "new test error");
            console.log("[" + val + "]" + "test1.sub.success - return test error");
            return Parse.Promise.error(new Parse.Error(10001, "test error (10001)"));
        } 
        return(count>0);
    }, function(error) {
        console.log("[" + val + "]" + "test1.sub.error " + error.get("message"));
        return(false);
    });
    console.log("[" + val + "]" + "test1.return");
    return promise2;
};

function test2(n) 
// use as a method on a save request
// returns true if the column value already exists
{
    console.log("test2.entry");
    var c = Parse.Object.extend("T");
    var query = new Parse.Query(c);

    query.equalTo("col", "val");
    var promise1 = query.count();
    var promise2 = promise1.then(function(count) {
        console.log("test2.promise1.success - " + count);
        if (n==1) {
            return test1("T", "reject", "test2call1e");
        } else {
            return test1("T", "col", "test2call1");
        }
    });

    var promise3 = promise2.then(function(count) {
        console.log("test2.promise1.success - " + count);
        if (n==2) {
            return test1("T", "reject", "test2call2e");
        } else {
            return test1("T", "col", "test2call2");
        }
    });

    var promise4 = promise3.then(function() {
        console.log("test2.promise3.success - " + count);
        return "test2 completed";
    }, function(error) {
        // Catch some errors here and repair them
        console.log("test2.promise3.error - " + error.message);
        return Parse.Promise.as("test2 completed - error repaired");
    });

    console.log("test2.exit");
    return promise4;
};

この出力が生成されました。

I2013-03-30T01:58:19.983Z] test0.entry
I2013-03-30T01:58:19.983Z] [test1call1]test1.entry
I2013-03-30T01:58:19.984Z] [test1call1]test1.return
I2013-03-30T01:58:19.984Z] test0.exit
I2013-03-30T01:58:20.085Z] [test1call1]test1.sub.success - 0
I2013-03-30T01:58:20.085Z] test0.0.success - false
I2013-03-30T01:58:20.085Z] [test1call2]test1.entry
I2013-03-30T01:58:20.085Z] [test1call2]test1.return
I2013-03-30T01:58:20.186Z] [test1call2]test1.sub.success - 0
I2013-03-30T01:58:20.186Z] test0.1.success - false
I2013-03-30T01:58:20.186Z] test2.entry
I2013-03-30T01:58:20.187Z] test2.exit
I2013-03-30T01:58:20.338Z] test2.promise1.success - 0
I2013-03-30T01:58:20.338Z] [test2call1e]test1.entry
I2013-03-30T01:58:20.338Z] [test2call1e]test1.return
I2013-03-30T01:58:20.439Z] [test2call1e]test1.sub.success - 0
I2013-03-30T01:58:20.439Z] [test2call1e]test1.sub.success - return test error
I2013-03-30T01:58:20.439Z] test2.promise3.error - test error (10001)
I2013-03-30T01:58:20.439Z] test0.2.success - test2 completed - error repaired
4

1 に答える 1