2017-02-10 5 views
1

Ich benutze einen Knoten js plugin: https://www.npmjs.com/package/promise-sequence, was ich versuche zu tun ist, übergeben Argumente an jede Funktion beim Aufruf Pipeline.Übergabe von Argumenten an die Promise-Sequenz

var Nightmare = require('nightmare'); 
var pipeline = require('promise-sequence/lib/pipeline'); 

var commonFunctions = require('./websites/_common/commonFunctions') 

var nightmare = Nightmare({ 
    show: true, 
    fullscreen : true, 
    waitTimeout: 10000 
}); 

    var resultsPromise = pipeline([ 
    commonFunctions.accessURL(nightmare), 
    commonFunctions.loginToWebsite(nightmare), 
    ]) 
    .then(() => commonFunctions.success(nightmare)) 
    .catch((error) => console.log(error)); 

Allerdings, wenn ich versuche, Argumente zu übergeben, es gibt mir eine Fehlermeldung:

TypeError: tasks[0].apply is not a function 
at C:\sad\node_modules\promise-sequence\lib\pipeline.js:25:57 
at process._tickCallback (internal/process/next_tick.js:103:7) 
at Module.runMain (module.js:607:11) 
at run (bootstrap_node.js:418:7) 
at startup (bootstrap_node.js:139:9) 
at bootstrap_node.js:533:3 

Wie kann ich meinen Alptraum Variable in der Pipeline zu jeder Funktion als Argument übergeben?

Antwort

2

können Sie entweder diese Funktionen binden:

var resultsPromise = pipeline([ 
    commonFunctions.accessURL.bind(null, nightmare), 
    commonFunctions.loginToWebsite.bind(null, nightmare), 
])... 

oder anonyme Funktionen nutzen:

var resultsPromise = pipeline([ 
    function() { return commonFunctions.accessURL(nightmare); }), 
    function() { return commonFunctions.loginToWebsite(nightmare); }), 
])... 

, die Sie kann es kürzer machen Pfeil-Funktionen verwenden, wenn Sie ES6 verwenden:

var resultsPromise = pipeline([ 
() => commonFunctions.accessURL(nightmare), 
() => commonFunctions.loginToWebsite(nightmare), 
])... 

Die Sache, die hier zu beachten ist, ist, dass eine Pipeline ein Array von Funktionen erfordert, die an sie übergeben werden sollen Diese Methoden, wir behalten die Funktionen, aber commonFunctions.accessURL und commonFunctions.loginToWebsite werden mit der Variablen nightmare entweder aufgerufen werden.

Der Grund, warum Ihr Code nicht funktioniert, oder wie Sie direkt aufrufen, ist, dass wenn Sie Ihre Funktionen aufrufen, sie starten und sie die Versprechen zurückgeben, aber Pipeline erwartet keine Versprechen, stattdessen erwartet es Funktionen, die gibt Versprechungen zurück, so dass diese Funktionen aufgerufen werden, sobald sie ausgeführt werden. Bind erstellt im Grunde neue Funktionen, die mit den gegebenen Argumenten vorgeladen werden, was wir im anonymen Funktionsfall tun.

+0

Danke, es hat funktioniert. – Coder

+0

Warum funktioniert es nicht direkt? Warum bedarf es anonymer Funktionen? – Coder

+0

@PHPLover Siehe den letzten Teil, den ich in der Antwort bearbeitet habe. –

Verwandte Themen