node js function.then in not a function using q

node js function.then in not a function using q

你好它是如此有线我正在尝试执行异步功能但是当我使用它时我得到错误

使用 q 在包裹上 json "q": "^1.4.1"

TypeError: helper.setNextUserNewsAction(...).then is not a function

这是我的帮手

module.exports = function() {
  return {
    setNextUserNewsAction: setNextUserNewsAction
  }
}();

function setNextUserNewsAction(minutesToSet){
    var defer = q.defer();
    var x = minutesToSet;
    var d = new Date();
    var nextNews = new Date(d.getTime() + x*60000);
    var minutes = nextNews.getMinutes();
    var newMinutesToSet = 0;
    for (var i = 0 , j = minutesToSet; j <= 60; i+=minutesToSet,j+=minutesToSet) {
        if (minutes > i && minutes < j)
            return newMinutesToSet = (i % 60);        
    }
    nextNews.setMinutes(newMinutesToSet);
    nextNews.setSeconds(00);
    var NextNewsAction = {
        AccessDate: nextNews,
        Type: 'News',
        Current: 1
    }
    defer.resolve(NextNewsAction);
    return defer.promise;        
}

当我在我的控制器中调用这个函数时,它向我发送了那个错误

var helper = require('../helpers/playlist');
helper.setNextUserNewsAction(15).then(function(action){
     console.log(action);
},function(err){ 
     console.log(err);
});

我也尝试过用 try and catch 来做,但仍然出现同样的错误 好吧,这不是第一次,也不是我使用 q 的第 20 次 希望有人能帮忙

问题是您从 for 循环返回了一些东西:

for (var i = 0, j = minutesToSet; j <= 60; i += minutesToSet, j += minutesToSet) {
    if (minutes > i && minutes < j)
        return newMinutesToSet = (i % 60);
}

所以 setNextUserNewsAction 函数没有返回承诺,因此没有 .then()

试试这个:

var q = require('q');

module.exports = function() {
    return {
        setNextUserNewsAction: setNextUserNewsAction
    }
}();

function setNextUserNewsAction(minutesToSet){
    var defer = q.defer();
    var x = minutesToSet;
    var d = new Date();
    var nextNews = new Date(d.getTime() + x*60000);
    var minutes = nextNews.getMinutes();
    var newMinutesToSet = 0;
    for (var i = 0, j = minutesToSet; j <= 60; i += minutesToSet, j += minutesToSet) {
        if (minutes > i && minutes < j) {
            newMinutesToSet = (i % 60);
        }
    }
    nextNews.setMinutes(newMinutesToSet);
    nextNews.setSeconds(00);
    var NextNewsAction = {
        AccessDate: nextNews,
        Type: 'News',
        Current: 1
    }
    defer.resolve();
    return defer.promise;
}