0

次のような forloop があります。

for (var name in myperson.firstname){
  var myphone = new phone(myperson, firstname);
    myphone.get(function(phonenumbers){
      if(myphone.phonearray){
      myperson.save();
      //Can I put a break here?; 
    }
  });
}

それが行うことは、さまざまな名前に基づいてデータベース内の電話番号を検索することです。私が達成したいのは、最初の名前のいずれかに関連付けられた番号を見つけたら、 myperson.save を実行してからすべての反復を停止して、重複が保存されないようにすることです。場合によっては、どの名前からも電話番号が返されないことがあります。

myphone.getサーバーリクエストが含まれており、成功するとコールバックがトリガーされます

応答内にブレークを入れると、ループの他の反復はどうなりますか? ほとんどの場合、他の http リクエストはすでに開始されています。彼らにセーブを実行させたくありません。私が考えた 1 つの解決策は、変数を forloop の外に置いて保存するように設定し、他のコールバックがいつトリガーされるかを確認することですが、それが最善の方法かどうかはわかりません。

4

2 に答える 2

1

呼び出しを制限するヘルパー関数を作成できます。

function callUntilTrue(cb) {
    var done = false;
    return function () {
        if (done) {
            log("previous callback succeeded. not calling others.");
            return;
        }
        var res = cb.apply(null, arguments);
        done = !! res;
    };
}

var myperson = {
    firstname: {
        "tom": null,
        "jerry": null,
        "micky": null
    },
    save: function () {
        log("save " + JSON.stringify(this, null, 2));
    }
};

var cb = function (myperson_, phonenumbers) {
    if (myperson_.phonearray) {
        log("person already has phone numbers. returning.");
        return false;
    }
    if (phonenumbers.length < 1) {
        log("response has no phone numbers. returning.");
        return false;
    }
    log("person has no existing phone numbers. saving ", phonenumbers);
    myperson_.phonearray = phonenumbers;
    myperson_.save();
    return true;
};

var restrictedCb = callUntilTrue(cb.bind(null, myperson));

for (var name in myperson.firstname) {
    var myphone = new phone(myperson, name);
    myphone.get(restrictedCb);
}

サンプル コンソール:

results for tom-0 after 1675 ms
response has no phone numbers. returning.
results for jerry-1 after 1943 ms
person has no existing phone numbers. saving , [
  "jerry-1-0-number"
]
save {
  "firstname": {
    "tom": null,
    "jerry": null,
    "micky": null
  },
  "phonearray": [
    "jerry-1-0-number"
  ]
}
results for micky-2 after 4440 ms
previous callback succeeded. not calling others.

偽のタイムアウトを使用したこの jsfiddle の完全な例。

編集HTML 出力とconsole.log.

于 2013-09-06T14:49:49.630 に答える