2016-07-13 6 views
2

こんにちは、私はJsを新しくしました。印刷前にいくつかの非同期関数が完了するのを待っています。niしかし、コードはそれを印刷することはありませんなぜ私は理解できません。私を助けてください:(すべての非同期機能が完了した後にPromise.allが機能しない理由を教えてください。

// public function 
this.run = function() { 
    'use strict'; 
    let compile_lib = lib_array.map((item) => { 
     return new Promise(() => {compileEntry(item);}) 
    }); 
    Promise.all(compile_lib).then(() => { console.log("ni"); }); 
} 
+2

あなたの約束は、引数を取る(解決、拒否)する必要があります。これらの議論のおかげで、約束が成功したか失敗したかを「言う」ことができます。だからあなたの約束の中で解決メソッドを呼び出さなければなりません;)それが助けてくれたら教えてください:) –

+0

compileEntryが単に長時間実行する関数である場合、あなたはそれを非同期的に書くことができませんWeb Workersのようなものです。これを行う正確な方法は、JavaScript環境によって異なります。ブラウザの場合は、Webワーカー、あるいはおそらくはsetTimeoutを使用して、インクルードメントでコンパイルの一部を実行するものがあります。これがある種の "コールバック"または "onload"引数を持つコアのサードパーティ関数を呼び出した場合、それを使用できます。 – Katana314

答えて

1

をPromise.all(反復可能)メソッドは、反復可能な引数での約束の 全てがを解決した、またはが理由で を拒否したときに解決する約束を返します。 。あなたの例では

拒否する最初に渡さ約束の、あなたの約束を解決するか、拒否しませんでした:

let compile_lib = lib_array.map((item) => { 
    return new Promise((resolve, reject) => { compileEntry(item); }) 
}); 

引数resolverejectに注意してください。これらのコールバックを使用して、約束を解決または拒否する必要があります。たとえば:

new Promise((resolve, reject) => { 
    var result = compileEntry(item); 
    if(result) { 
     resolve(result); 
    }else { 
     reject("reson"); 
    } 
}) 
0

あなたはresolvereject

新しい約束を(/ *エグゼ* /機能(解決、拒否){...})を使用する必要があります。

var lib_array = [1, 2, 3]; 
 

 
function compileEntry(item, index) { 
 
    return new Promise((resolve, reject) => { 
 
    setTimeout(function() { 
 
     resolve(console.log(item)); 
 
    }, index * 1000); 
 
    }); 
 
} 
 

 
this.run = function() { 
 
    'use strict'; 
 
    let compile_lib = lib_array.map((item, index) => { 
 
    return compileEntry(item, index); 
 
    }); 
 
    Promise.all(compile_lib).then(() => { 
 
    console.log("ni"); 
 
    }); 
 
} 
 

 
this.run();

関連する問題