2017-06-12 36 views
0

目的傳遞數據

我有三個功能,我第一次從後得到的數據,第二個得到我的API密鑰和第三後數據的API。我希望按照從1到3的順序運行每個函數,我已經找到了一個在節點內使用諾言的簡潔解決方案。

函數現在以正確的順序運行,但我需要將數據從一個函數傳遞到下一個函數。

我需要傳遞:

var emailUser = req.body.email; 

從我的第一個功能,我的第三個

和:

var api_key = client.apiKey; 

從第二功能,我的第三個

這是我願意,我想我幾乎在那裏。

var express = require('express'); 
var request = require('request'); 
// var promise = require('promise'); 
var nodePardot = require('node-pardot'); 
var bodyParser = require('body-parser'); 
var app = express(); 
var port = process.env.PORT || 8080; 

// Varibles to use in second and third function 
var password = 'password'; 
var userkey = 'hghgd7289j'; 
var emailAdmin = '[email protected]'; 

// var emailUser; 
// var api_key; 

// start the server 
app.listen(port); 
app.use(bodyParser.json()); // support json encoded bodies 
app.use(bodyParser.urlencoded({extended: true})); // support encoded bodies 
console.log('Server started! At http://localhost:' + port); 

var firstMethod = function() { 
    var promise = new Promise(function(resolve, reject){ 
     setTimeout(function() { 
      app.post('/api/data', function (req, res) { 
       console.log(req.body); 
       // var Fname = req.body.fname; 
       // var Lname = req.body.lname; 
       var emailUser = req.body.email; 
       // res.send(Fname + ' ' + Lname + ' ' + emailUser); 
       res.send(emailUser); 
      }); 
      console.log('first method completed'); 
      resolve({data: emailUser}); 
     }, 2000); 
    }); 
    return promise; 
}; 


var secondMethod = function(someStuff) { 
    var promise = new Promise(function(resolve, reject){ 
     setTimeout(function() { 
      nodePardot.PardotAPI({ 
       userKey: userkey, 
       email: emailAdmin, 
       password: password, 
       // turn off when live 
       DEBUG: true 
      }, function (err, client) { 
       if (err) { 
        // Authentication failed 
        // handle error 
        console.error("Authentication Failed", err) 
       } else { 
        // Authentication successful 
        // gets api key 
        var api_key = client.apiKey; 
        console.log("Authentication successful !", api_key); 
       } 
      }); 
      console.log('second method completed'); 
      resolve({newData: api_key}); 
     }, 2000); 
    }); 
    return promise; 
}; 

var thirdMethod = function(someStuff) { 
    var promise = new Promise(function(resolve, reject){ 
     setTimeout(function() { 
      var headers = { 
       'User-Agent':  'Super Agent/0.0.1', 
       'Content-Type':  'application/x-www-form-urlencoded' 
      }; 

      var emailUser = resolve.emailUser; 
      var api_key = resolve.api_key; 

// Configure the request 
      var options = { 
       url: 'https://pi.pardot.com/api/prospect/version/4/do/create/email', 
       method: 'POST', 
       headers: headers, 
       form: { 
        'email': emailUser, 
        'user_key': userkey, 
        'api_key': api_key 
       } 
      }; 

// Start the request 
      request(options, function (error, response, body) { 
       if (!error && response.statusCode == 200) { 
        // Print out the response body 
        console.log("API Key",api_key); 
        console.log("user",emailUser); 
        console.log("error",body); 

       } 
       else { 
        console.log("Sent Data",body); 
       } 
      }); 
      console.log('third method completed'); 
      resolve({result: someStuff.newData}); 
     }, 3000); 
    }); 
    return promise; 
}; 

firstMethod() 
    .then(secondMethod) 
    .then(thirdMethod); 

回答

0

有幾種方法可以做到這一點。如果有firstMethod和secondMethod之間沒有直接的依賴,那麼你可以使用all與thirdMethod繼續之前解決它們:

Promise.all([ firstMethod, secondMethod ]) 
.then((results) => { 
    var emailUser, api_key; 
    [ emailUser, api_key ] = results; 
    ... 
}); 
+0

嗯抱歉,在新的節點和承諾。我會在我的代碼結尾處應用這個嗎? – Beep

+0

而不是'firstMethod()。then(secondMethod).then(thirdMethod);',儘管你可能想要修改thirdMethod的開始以顯示的方式讀取結果。如通過其他答案所示,通過承諾鏈傳遞的單個結果對象上的積累值是另一種方式。 –

0

你可以這樣做:

firstMethod() 
    .then(secondMethod) 
    .then(thirdMethod) 
    .then((thirdMethodValue) => { 
     console.log(thirdMethodValue); 
    }); 

var firstMethod = function() { 
    return new Promise((resolve, reject) => { 
     setTimeout(() => { 
      resolve(1); 
     }); 
    }); 
}; 

var secondMethod = function (firstPromiseValue) { 
    console.log(firstPromiseValue); // 1 
    return new Promise((resolve, reject) => { 
     setTimeout(() => { 
      resolve(2 + firstPromiseValue); 
     }); 
    }); 
}; 

var thirdMethod = function (secondPromiseValue) { 
    console.log(secondPromiseValue); //3 (2 + 1) 
    return new Promise((resolve, reject) => { 
     setTimeout(() => { 
      resolve(3 + secondPromiseValue); 
     }); 
    }); 
}; 

firstMethod() 
    .then(secondMethod) 
    .then(thirdMethod) 
    .then((value) => { 
     console.log(value); // 6 (3 + 3) 
    }); 
1

也許下面的例子,從你的代碼改編,將有助於 - 而不是做API調用來解決電子郵件/等。價值觀,我只是隨時與他們合作。

問題是,您傳遞給resolve()的值將最終成爲.then()處理程序的參數。

var firstMethod = function() { 
    return new Promise((resolve) => { 
     console.log('Email acquired'); 
     resolve({data: '[email protected]'}); 
    }); 
}; 


var secondMethod = function(data) { 
    return new Promise((resolve) => { 
     const newData = Object.assign({}, data, {time: '' + new Date()}); 
     console.log('Time acquired'); 
     resolve(newData); 
    }); 
}; 

var thirdMethod = function(data) { 
    return new Promise((resolve) => { 
     setTimeout(() => { 
      console.log('The data is ', data); 
      resolve(data); 
     }, 1000); 
    }); 
}; 

firstMethod() 
    .then(secondMethod) 
    .then(thirdMethod) 
    .then(() => console.log('All done!')); 

輸出是

Email acquired 
Time acquired 
The data is { data: '[email protected]', time: 'Mon Jun 12 2017 18:53:28 GMT+0300 (EEST)' } 
All done! 
+0

好,很好。我喜歡它,我適應這個我的代碼,然後接受答案,當我得到它的工作。謝謝 – Beep

+0

有一些問題,但只要我得到這個工作不正常接受你的答案 – Beep