在我的平均堆栈应用程序中使用承诺

Using promises in my mean stack app

本文关键字:承诺 应用程序 堆栈 我的      更新时间:2023-09-26

我创建了一个控制器,该控制器根据用户在 URL 中的输入执行必应搜索。根据我执行控制台的结果.log控制器工作正常,我已将该变量设置为返回。在路由文件中,信息不会显示在页面中。我认为这可能是一个异步问题,所以我尝试使用 promise 来确保控制器在尝试执行 res.json 之前已返回,但我对承诺不是很熟悉,所以我的语法可能已关闭,或者我可能以错误的方式处理这个问题。有人会看看这个语法,看看是否有问题。当前页面上仅显示一个空对象。

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;

你能试试这个代码吗?这里有 bing.search 文档,https://www.npmjs.com/package/bing.search 始终尝试在 NodeJs 中使用回调而不是承诺,请记住回调的第一个参数始终是错误(如果有),然后是响应

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;

这样的事情应该有效。

使用回调

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

此外,您需要重新设计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);
        }
   });
}

使用承诺

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