【问题标题】:Passing data between functions with promise in Node在 Node 中使用 Promise 在函数之间传递数据
【发布时间】:2017-11-14 04:10:40
【问题描述】:

目标

我有三个函数,我首先从帖子中获取数据,第二个获取我的 API 密钥,第三个将数据发布到 API。我希望按从 1 到 3 的顺序运行每个函数,我在 node 中使用 promise 找到了一个很好的解决方案。

函数现在以正确的顺序运行,但我需要将数据从一个函数传递到下一个函数。

我需要通过:

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 = 'some@g.com';

// 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);

【问题讨论】:

    标签: javascript node.js api promise


    【解决方案1】:

    也许以下根据您的代码改编的示例会有所帮助 - 而不是通过 API 调用来解析电子邮件/等。值,我只是在动态中提出它们。

    关键是您传递给resolve() 的值最终将成为.then() 处理程序的参数。

    var firstMethod = function() {
        return new Promise((resolve) => {
            console.log('Email acquired');
            resolve({data: 'foo@example.com'});
        });
    };
    
    
    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: 'foo@example.com', time: 'Mon Jun 12 2017 18:53:28 GMT+0300 (EEST)' }
    All done!
    

    【讨论】:

    • 好的,很好。我喜欢它,我会根据我的代码调整它,然后在我让它工作时接受答案。谢谢
    • 有一些问题,但一旦我得到这个工作,我就会接受你的回答
    【解决方案2】:

    有几种方法可以做到这一点。如果 firstMethod 和 secondMethod 之间没有直接依赖关系,那么您可以使用 all 来解决它们中的每一个,然后再继续使用 thirdMethod:

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

    【讨论】:

    • 嗯,很抱歉对节点和承诺的新手。我会在我的代码末尾应用这个吗?
    • 而不是firstMethod().then(secondMethod).then(thirdMethod);,尽管您可能希望修改thirdMethod 的开头以按所示方式读取结果。在通过承诺链传递的单个结果对象上累积值是另一种方法,如另一个答案所示。
    【解决方案3】:

    你可以这样做:

    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)
        });
    

    【讨论】:

      猜你喜欢
      • 2018-04-27
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多