2017-10-05 16 views
0

に移動する前に解決を待っている:JavaScriptの約束 - 私は次の操作を実行する必要があり

  1. は、内部関数(getLinesを())を呼び出して、「行」のリストを取得します。
  2. 、最初の行を選択し、前の動作が完了した後アクション
  3. を行い、次の行を選択し、すべての行(ユーザに応じて3-20)ため

を同じアクション

  • 繰り返しを行います私は場所に次のコードを持っている:

    App.Lines = response.data;  
    for (var _i = 0; _i < App.Lines.length; _i++) { 
        var makeCallPromise = new Promise(
         function(resolve, reject) { 
          Session.connection.ol.makeCall(App.Lines[_i], callBackFunction(response) { 
           //this can take up to 30 seconds to respond... 
           resolve(response.data); 
          }, errorCallBackFunction(message) { 
           reject(message.error); 
          }, bareJid); 
         } 
        ) 
        makeCallPromise.then(function(fulfilled) { 
         console.log("PROMISE WORKED!!!!!", fulfilled); 
        }) 
        .catch(function(error) { 
         console.log("PROMISE FAILED!!!!!", error); 
        }); 
    } 
    

    私の希望は、それがループを続けて前にループが約束を解決するのを待つというものであった、しかし、そうではありません。 私の質問は、解決が完了するまでループを停止することができるかどうかです。 注 - 私は約束のためにbluebird JSライブラリを使用しています。 ありがとうございました!配列内の次の要素に

  • +0

    私は、何らかの形で約束を「返す」必要があると思います。この場合のように、あなたの約束で使う主な句が「実現」されます。 – ZombieChowder

    +0

    全体をループする代わりに、makeCallPromiseをループし、それらの約束を配列にプッシュします。次に、Promise.all(配列)を使用して、promise.allの後に 'then()'を追加します。その結果、最初の 'then()'が呼び出される前にすべてのpromsが解決されるので、すべてのデータが再びループすることができます。あるいは、ループをまったく使用しないでくださいが、前者の解決後に次のmakeCallPromiseを作成してください。 – Shilly

    +0

    @ Shillyありがとう、私はpromise.each()とmarvel308によって提供される答えでこれを使ってみました。私の反応は、私がやったことと何が起こったのかです。 – Gary

    答えて

    0

    、それを直列配列を横断しますし、それらを解決するのを待つIブルーバードについて知りませんが、次の繰り返しの前にそれぞれの約束が終わるのを待っている何らかのforループを作成するようなことをすることができます。ここで

    は、一般的な例ですが、それは確かにそれだけで迅速な試みだ、最適化することができます:これはあなたを助けることを望ん

    var i = 0; 
    var performAsyncOperation = function(operationNumber) { 
        return new Promise(function(resolve, reject){ 
        console.log('Operation number', operationNumber); 
        resolve(); 
        }); 
    } 
    
    var chainAsyncOperations = function() { 
        if(++i < 10) { 
         return performAsyncOperation(i).then(chainAsyncOperations); 
        } 
    }; 
    performAsyncOperation(i).then(chainAsyncOperations); 
    

    ;)

    +0

    私は、約束を反復して使用しようとしました(反復で解決するのではなく)。私はそれから、Promise.each(promiseArray、function(result){console.log(result)})を呼び出しました(function(fulfiled){console.log( "WORKED")})。 console.log( "ERROR")})); '問題は、これがうまくいかず、最初に解決するのを待たずにSession.connection.ol.makeCallの両方を実行しようとしていることです。 – Gary

    +0

    bluebirdを使用しましたか? – marvel308

    +0

    えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええん:このような音は必要ですか? – Gary

    0

    を移動する前に、あなたはブルーバードが提供するPromise.each()を使用することができます

    種類よろしく、

    ゲイリー

    0

    このユースケースは、完全にES7機能async awaitと一致し、あなたがbabeljsを使用してコードをtranspileする可能性を持っている場合は、このようなあなたの機能をリファクタリングできます

    function createPromise(line) { 
        return new Promise(
         function(resolve, reject) { 
          Session.connection.ol.makeCall(line, callBackFunction(response) { 
           //this can take up to 30 seconds to respond... 
           resolve(response.data); 
          }, errorCallBackFunction(message) { 
           reject(message.error); 
          }, bareJid); 
         } 
        ); 
    } 
    
    App.Lines = response.data; 
    
    async function main() { 
        for (var _i = 0; _i < App.Lines.length; _i++) { 
         try { 
          var result = await createPromise(App.Lines[_i]); 
          console.log(result); 
         } catch (err) { 
          console.log(err); 
         } 
        } 
    } 
    
    main().then(function() { 
        console.log('finished'); 
    }); 
    
    0

    あなたは0123を使用する必要があります方法:

    .each(関数(任意の項目、int型のインデックス、int型の長さ)反復子) - >プロミスアレイ、又は約束を含む配列、の約束上

    反復(あるいは約束と値のミックス)をシグネチャー(値、インデックス、長さ)を持つ与えられたイテレーター関数で置き換えます。ここで、valueは入力配列内のそれぞれの約束の解決された値です。反復は連続して起こります。入力配列の約束が拒否された場合、返された約束は拒否されます。

    Promise.each(App.Lines, line => { 
        return new Promise((resolve, reject) => { 
         Session.connection.ol.makeCall(line, callBackFunction(response) { 
          resolve(response.data); 
         }, errorCallBackFunction(message) { 
          reject(message.error); 
         }, bareJid); 
        }) 
        .then(fulfilled => console.log("PROMISE WORKED!!!!!", fulfilled)) 
        .catch(err => onsole.log("PROMISE FAILED!!!!!", err)); 
    }); 
    
    +0

    こんにちは、これは動作していない、私はそれが何をやっているのか分かりません。単純に1行の値を指定すると、同じ瞬間に 'Session.connection.ol.makeCall'を2回発行しているように見えるので、すぐに失敗します。これを2行に更新すると、すぐに4つの 'Session.connection.ol.makeCall'が発行され、その後、応答が返ってからさらに2回発行されます。 – Gary

    +0

    あなたの質問のコードによると、 'App.Lines'は行の配列です。私のコードでは' Bluebird#each'メソッドを使ってその配列を繰り返し、各行に 'Session.connection.ol.makeCal'を呼び出します。 'App.Lines'は最初の行に1行(1要素)、2行目に2行がありますか? 'Promise.each'の前に' console.log(App.Lines.length) 'を追加してください。 – alexmac

    関連する問題