简体   繁体   English

在我的平均值堆栈应用程序中使用Promise

[英]Using promises in my mean stack app

I've created a controller that does a bing search based on the user's input into the url. 我创建了一个控制器,该控制器根据用户在url中的输入进行bing搜索。 Based on my results from doing a console.log the controller is working correctly and I have set that variable to return. 根据执行console.log的结果,控制器正在正常工作,并且我将该变量设置为return。 In the route file the information is not displaying to the page. 在路由文件中,信息未显示在页面上。 I thought it might be an asynchronous issue so I am trying to use promises to make sure the controller has returned before it tries to do the res.json but I'm not very familiar with promises so my syntax might be off or I might be going about this the wrong way. 我认为这可能是一个异步问题,因此我尝试使用Promise来确保控制器在尝试执行res.json之前已返回,但是我对Promise不太熟悉,因此我的语法可能不正确,或者我可能以错误的方式去做。 Will someone take a look at this syntax and see if there is an issue.Currently only an empty object is displaying on the page. 有人会看一下这种语法,看看是否有问题。当前页面上仅显示一个空对象。

app.route('/imagesearch/:keyword')
    .get(function (req, res) {
        var resObj = [];
        resObj = new Promise (function(resolve, reject){
            resolve(bingSearchHandler.findImages(req.params));
        });

        resObj.then(res.json(resObj));

    });

//BINGSEARCHHANDLER
'use strict';

var bingAPPID = 'fwHyQAoJMJYmK8L4a3dIV2GAEUfXAlFRjCnBx0YbfPE=';
var Search = require('bing.search');
var util = require('util');

var search = new Search(bingAPPID);

function bingSearchHandler () {

this.findImages = function(userInput){
    var keyword = userInput.keyword;
    search.images(keyword,
          {top: 10},
          function(err, results) {
            if(err)
                {
                    console.log(err);
                }
            else
                {
                    var resArr = [];
                  (util.inspect(results, 
                  {colors: true, depth: null})); 

                  for(var i=0;i<results.length;i++)
                    {
                        var tempObj = {};
                        tempObj.url = results[i].url;
                        tempObj.snippet = results[i].title;
                        tempObj.thumbnail = results[i].thumbnail.url;
                        tempObj.context = results[i].sourceUrl;

                        resArr.push(tempObj);
                    }
                    console.log(resArr);
                    return resArr;
                }
          }
        );
  }

}

module.exports = bingSearchHandler;

Something like this should work. 这样的事情应该起作用。

Using callbacks 使用回调

app.route('/imagesearch/:keyword')
    .get(function (req, res) {
        // Make the async request, pass the callback function
        bingSearchHandler.findImages(req.params, (error, response) => {
            if (error === null) {
                res.json(response);
            }
        });
    });

Additionally, you'll need to rework your findImages function. 此外,您需要重新处理findImages函数。

this.findImages = (userInput, callback) => {
    var keyword = userInput.keyword;
    search.images(keyword, {top: 10}, function (err, results) {
        if (err) {
            callback(err);
        }
        else {
            var resArr = [];
            util.inspect(results, {colors: true, depth: null}); 

            for(var i = 0; i < results.length; i++) {
                var tempObj = {};
                tempObj.url = results[i].url;
                tempObj.snippet = results[i].title;
                tempObj.thumbnail = results[i].thumbnail.url;
                tempObj.context = results[i].sourceUrl;

                resArr.push(tempObj);
            }
            callback(null, resArr);
        }
   });
}

Using promises 兑现承诺

app.route('/imagesearch/:keyword')
    .get(function (req, res) {
        // Make the async request, pass the callback function
        bingSearchHandler.findImages(req.params).then(response => 
            res.json(response);
        });
    });


// Images function
this.findImages = (userInput) => {
    return new Promise((resolve, reject) => {
        var keyword = userInput.keyword;
        search.images(keyword, {top: 10}, function (err, results) {
            if (err && typeof reject === 'function') {
                reject(err);
            }
            else {
                var resArr = [];
                util.inspect(results, {colors: true, depth: null}); 

                for(var i = 0; i < results.length; i++) {
                    var tempObj = {};
                    tempObj.url = results[i].url;
                    tempObj.snippet = results[i].title;
                    tempObj.thumbnail = results[i].thumbnail.url;
                    tempObj.context = results[i].sourceUrl;

                    resArr.push(tempObj);
                }
                if (typeof resolve === 'function') {
                    resolve(resArr);
                }
            }
        });
    });
}

Could you please try this code? 您能试试这个代码吗? Here you have the bing.search documentation, https://www.npmjs.com/package/bing.search Always try to use callbacks instead of promises in NodeJs, remember that the first parameter of a callback is always the error (if there is any), then the response 在这里,您拥有bing.search文档, https: //www.npmjs.com/package/bing.search始终尝试在NodeJs中使用回调而不是Promise,请记住,回调的第一个参数始终是错误(如果存在是任何),则响应

app.route('/imagesearch/:keyword')
.get(function (req, res) {
    bingSearchHandler.findImages(req.params, function (err, response) {
      if (err) return res.status(400)

      res.json(response)
    })
});

//BINGSEARCHHANDLER
'use strict';

var bingAPPID = 'fwHyQAoJMJYmK8L4a3dIV2GAEUfXAlFRjCnBx0YbfPE=';
var Search = require('bing.search');
var util = require('util');

var search = new Search(bingAPPID);

function bingSearchHandler () {

this.findImages = function(userInput, callback){
    var keyword = userInput.keyword;
    search.images(keyword,
          {top: 10},
          function(err, results) {
            if(err) callback(err)
            else
                {
                    var resArr = [];
                  (util.inspect(results,
                  {colors: true, depth: null}));

                  for(var i=0;i<results.length;i++)
                    {
                        var tempObj = {};
                        tempObj.url = results[i].url;
                        tempObj.snippet = results[i].title;
                        tempObj.thumbnail = results[i].thumbnail.url;
                        tempObj.context = results[i].sourceUrl;

                        resArr.push(tempObj);
                    }
                    console.log(resArr);
                    return callback(null, resArr);
                }
          }
        );
  }

}

module.exports = bingSearchHandler;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM