Pertanyaan Janji, berikan parameter tambahan ke rantai itu


janji, hanya sebagai contoh

var P = new Promise(function (resolve, reject) {
  var a = 5;
  if (a) {
    setTimeout(function(){
      resolve(a);
    }, 3000);
  } else {
    reject(a);
  }
});

Setelah itu kami memanggil metode yang dijanjikan:

P.then(doWork('text'));

fungsi doWork terlihat seperti ini:

function doWork(data) {
  return function(text) {
    // sample function to console log
    consoleToLog(data);
    consoleToLog(b);
  }
}

bagaimana saya bisa menghindari fungsi internal di doWork, untuk mendapatkan akses ke data dari janji dan parameter teks? apakah ada trik? Terima kasih.


75
2017-10-02 17:15


asal


Jawaban:


Kamu dapat memakai Function.prototype.bind untuk membuat fungsi baru dengan nilai yang diteruskan ke argumen pertamanya, seperti ini

P.then(doWork.bind(null, 'text'))

dan kamu bisa berubah doWork untuk,

function doWork(text, data) {
  consoleToLog(data);
}

Sekarang, text akan menjadi sebenarnya 'text' di doWork dan data akan menjadi nilai yang diselesaikan oleh Janji.

catatan: Harap pastikan bahwa Anda melampirkan pawang penolakan ke rantai janji Anda.


Program kerja:  Salin langsung di REPL Babel

function doWork(text, data) {
  console.log(text + data + text);
}

new Promise(function (resolve, reject) {
    var a = 5;
    if (a) {
      setTimeout(function () {
        resolve(a);
      }, 3000);
    } else {
      reject(a);
    }
  })
  .then(doWork.bind(null, 'text'))
  .catch(console.error);

68
2017-10-02 17:23



Mungkin jawaban yang paling mudah adalah:

P.then(function(data) { return doWork('text', data); });

Atau, karena ini ditandai ecmascript-6, menggunakan fungsi panah:

P.then(data => doWork('text', data));

Saya menemukan ini paling mudah dibaca, dan tidak terlalu banyak menulis.


75
2017-10-05 00:15



Gunakan currying.

var P = new Promise(function (resolve, reject) {
    var a = 5;
    if (a) {
        setTimeout(function(){
            resolve(a);
        }, 3000);
    } else {
        reject(a);
    }
});

var curriedDoWork = function(text) {
    return function(data) {
        console.log(data + text);
    }
};

P.then(curriedDoWork('text'))
.catch(
    //some error handling
);

3
2017-10-22 10:53



Lodash menawarkan alternatif yang bagus untuk hal yang tepat ini.

 P.then(_.bind(doWork, 'myArgString', _));

 //Say the promise was fulfilled with the string 'promiseResults'

 function doWork(text, data) {
     console.log(text + " foo " + data);
     //myArgString foo promiseResults
 }

Atau, jika Anda ingin fungsi kesuksesan Anda hanya memiliki satu parameter (hasil janji yang dipenuhi), Anda dapat menggunakannya dengan cara ini:

P.then(_.bind(doWork, {text: 'myArgString'}));

function doWork(data) {
    console.log(data + " foo " + this.text);
    //promiseResults foo myArgString
}

Ini akan menempel text: 'myArgString' ke this konteks dalam fungsi.


1
2018-05-19 19:47