Pertanyaan Bagaimana cara menunggu janji untuk diselesaikan?


Saya berurusan dengan kerangka NodeJs yang membutuhkan fungsi tertentu agar sinkron, tetapi saya harus mengambil nilai yang hanya dapat diakses secara asynchronous. Di dunia yang sempurna, saya akan bisa mengembalikan janji, tetapi saya tidak bisa.

Sebagai solusi cepat dan kotor, saya membuat metode berikut:

exports.synchronizePromise = function(promise) {
    var value;
    promise.then(function(promiseValue) {
        value = promiseValue;
    });
    while (!value) {} // Wait for promise to resolve
    console.log("DONE: " + value); // Never reached
    return value;
};

Tapi saya mendapat kesalahan. Apakah ada cara untuk mencapai apa yang saya butuhkan?


32
2018-06-11 18:57


asal


Jawaban:


Mengingat bahwa node secara default hanya berulir tunggal tidak ada cara yang mudah untuk menyelesaikan ini. Namun ada satu. Basis pada generator / serat Anda dapat menambahkan semacam eksekusi bersamaan ke node. Ada sebuah waitfor pelaksanaan berdasarkan hal tersebut.


3
2018-03-15 13:40



Dalam Q jika Anda memiliki janji yang telah diselesaikan, Anda bisa mengambil nilai dengan memeriksa

exports.synchronizePromise = function(promise) {
  var i = promise.inspect();
    if (i.state === "rejected") {
      throw i.reason;
    } else if (i.state === "fulfilled") {
      return i.value;
    } else {
      throw new Error("attempt to synchronize pending promise")
    }
};

Namun jika janji itu tertunda, itu benar-benar asynchronous dan pertanyaan Anda tidak masuk akal dan fungsi akan melemparkan kesalahan.


2
2018-06-11 20:21



Janji itu tidak sinkron. Mereka mewakili nilai masa depan - nilai yang tersedia dalam 1ms, atau 1 menit, atau 1 hari, atau 1 tahun di masa depan, atau tidak pernah. Menurut definisi, tidak ada cara untuk "memaksa" mereka untuk menyelesaikannya, selain mesin waktu.

Jika Anda memiliki logika hulu yang dibangun di atas premis sinkronisitas, tetapi untuk alasan apa pun hal-hal itu tergantung pada sekarang asynchronous, Anda harus refactor bahwa komponen hulu untuk beroperasi secara asynchronous juga. Tidak ada alternatif lain.

Jika kerangka kerja Anda "memerlukan fungsi tertentu untuk sinkron" ketika fungsi itu tidak atau tidak dapat sinkron, maka kerangka itu dirancang dengan buruk dan tidak dapat digunakan, atau setidaknya tidak dapat digunakan untuk masalah Anda.


-2
2018-06-29 03:32