Obietnic, przekazać dodatkowe parametry do łańcucha

Obietnica, na przykład

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

Po wywołaniu metody na obietnicy:

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

Funkcja DoWork wygląda tak:

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

Jak uniknąć funkcji wewnętrznej w doworku, aby uzyskać dostęp do danych z parametru promise I text? jeśli są jakieś sztuczki? dzięki.

Author: thefourtheye, 2015-10-02

4 answers

Możesz użyć Function.prototype.bind aby utworzyć nową funkcję z wartością przekazaną do jej pierwszego argumentu, jak to

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

I możesz zmienić doWork na,

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

Teraz text będzie faktycznie 'text' W doWork i data będzie wartością ustaloną przez obietnicę.

Uwaga: upewnij się, że dołączasz funkcję obsługi odrzucenia do łańcucha obietnic.


Program roboczy: Live copy on Babel ' s REPL

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);
 69
Author: thefourtheye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-12 12:57:46

Być może najprostsza odpowiedź brzmi:

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

Lub, ponieważ jest to oznaczone ecmascript-6, za pomocą funkcji strzałek:

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

Uważam to za najbardziej czytelne i nie za dużo do napisania.

 77
Author: jib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-05 00:15:43

Użyj 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
);
 4
Author: yks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-22 10:53:28

Lodash oferuje miłą alternatywę dla tej właśnie rzeczy.

 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
 }

Lub, jeśli chcesz, aby Twoja funkcja sukcesu miała tylko jeden parametr( spełnione wyniki obietnicy), możesz użyć go w ten sposób:

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

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

To dołączy {[2] } do kontekstu this w ramach funkcji.

 1
Author: JellyRaptor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-19 20:00:50