promise在回调中给出未定义的结果

时间:2017-03-29 17:30:49

标签: node.js

fileUpload.js

var Uploader = require('s3-image-uploader');
var express = require('express');
var config = require('./../config.js');
var Promise = require('promise');

var uploader = new Uploader({
    aws: {
        key: config.awsKey,
        secret: config.awsSecret
    },
    websockets: false
});


exports.fileUpload = function(fileName) {

    new Promise(function(resolve, reject) {

        uploader.upload({
                fileId: 'someUniqueIdentifier',
                bucket: 'quflip',
                source: './public/images/' + fileName,
                name: fileName
            },
            function(data) { // success
                console.log('upload success:', resolve);
                resolve(data);
            },
            function(errMsg, errObject) { //error
                reject(false);
            });
    });
};

logintest.js

var awsUpload = require('./../config/fileUpload.js');

var userData = function(req, res) {
console.log("true/false" + awsUpload.fileUpload(profile_image));

这里发生了什么,我在console.log中得到了未定义的值。所以这意味着回调没有传递数据。如何有效地传递数据以实现进一步的目的

2 个答案:

答案 0 :(得分:1)

您需要使用.then链接到承诺并在那里执行日志。首先,确保return承诺

return new Promise(function(resolve, reject) {

然后,你可以这样做:

var userData = function (req, res) {
  awsUpload.fileUpload(profile_image).then(data => {
    console.log("true/false" + data);
  });
}

如果您在支持async / await的环境中工作,则可以更简单地执行此操作:

var userData = async function (req, res) {
  console.log("true/false" + await awsUpload.fileUpload(profile_image));
};

请记住,这将返回一个承诺。

我不知道profile_image设置在哪里。

答案 1 :(得分:0)

如果您希望您的函数实际返回promise,请更改此:

exports.fileUpload = function (fileName) {
    new Promise(function(resolve, reject) {
        // ...
    });
};

到此:

exports.fileUpload = function (fileName) {
    return new Promise(function(resolve, reject) {
        // ...
    });
};

如果没有return语句,您正在创建的承诺将不会被您的函数返回。

但即便如此,你也无法像这样使用它:

console.log("true/false" + awsUpload.fileUpload(profile_image));

你必须使用这样的东西:

awsUpload.fileUpload(profile_image).then(result => {
  console.log("true/false" + result);
});

或者,如果您使用的是async / await并且您在async函数内部,那么这就是

console.log("true/false" + await awsUpload.fileUpload(profile_image));