2015-07-17 8 views
0

У меня возникли некоторые проблемы с получением пользовательского обещания работать с моим маленьким приложением, над которым я работаю.Возвращение пользовательского обещания

Вот сокращенный вариант моего app.js

var Promise = require('promise'); 
var Commands = require('./commands'); 

var respond = function() { 
    var messageToRespondWith = command[0].response; 
    if(typeof(command[0].response) == "function"){ 
     console.log('is function'); 
     command[0].response().then(console.log('finished')); 
    } 
    var response = template(messageToRespondWith, {user: user, channel: channel, message: message}); 
    client.say(channel, response); 
}; 

И команды выглядит примерно так

var config = require('./config'); 
var Promise = require('promise'); 

module.exports = [ 
    { 
    trigger: "!random", 
    response: function(){ 
     var unirest = require('unirest'); 
     var promise = new Promise(function(resolve, reject) { 
     unirest.post("https://andruxnet-random-famous-quotes.p.mashape.com/cat=movies") 
     .header("X-Mashape-Key", config.mashapeKey) 
     .header("Content-Type", "application/x-www-form-urlencoded") 
     .header("Accept", "application/json") 
     .end(function (result) { 
     console.log(result.status); 
     // Handle errors 
     if(result.status != 200){ 
      return promise.reject(result.body); 
     }else{ 
      var json = JSON.parse(result.body); 
      return promise.resolve(json.quote); 
     } 
     }); 
    }); 
    }, 
    permission: null 
    }, 
] 

The app.js проверки кода, чтобы увидеть, если тип возвращаемого значения является функцией, а если он выполняет его и должен сохранить это переменной и передать это следующей функции.

Мне нужно использовать обещание, потому что, очевидно, нижний вызов функции client.say() не ждет, пока возвращаемое значение вызовет API-функцию функции из файла commands.js.

Когда я пытаюсь выполнить этот код в моем терминале я получаю эту ошибку ...

TypeError: Cannot read property 'then' of undefined 
at respond (/***/app.js:39:28) 

Так что я не совсем уверен, почему это происходит, я все еще учусь узел и лучший способы сделать что-то, поэтому, возможно, я вообще ошибаюсь.

Основные функциональные

Это подергивание IRC чат бот, который будет читать команды набираясь в и реагировать в чате с заданным сообщением. В некоторых случаях я хочу сделать какую-то функцию, прежде чем выплевывать сообщение. Это один из таких случаев. Вы можете увидеть мой полный код app.jshere Я не хотел вставлять все это, потому что он длинный и включает в себя части, которые, как я думал, здесь не актуальны.

+1

1) вы не отправлял код, где вы на самом деле вызова 'respond', 2) в вашем файле' 'команды respond' функции [0]', кажется, очень четко определено. Вы хотели передать это как аргумент? – azium

+0

О, я вижу вас, я думаю, вы хотите сказать: 'var command = require ('./ commands')' – azium

+0

Вот полное repo минус команды и файлы конфигурации, если вы хотите увидеть полный код, я не хочу здесь, потому что я не думаю, что это актуально, но может быть. https://github.com/Jordan4jc/super-fly-twitch-bot – Jordan

ответ

2

Вам необходимо вернуть обещание в конце этой функции. по умолчанию ваша функция возвращает «undefined», поэтому ошибка. Вам нужно возвратить обещание синхронно, а затем вы будете асинхронно его решать.

В вашем обратном вызове end вы возвращаете promise.resolve(..), но это неправильное. Вам нужно позвонить promise.resolve(..), но не нужно его возвращать.

response: function(){ 
     var unirest = require('unirest'); 
     var promise = new Promise(function(resolve, reject) { 
     unirest.post("https://andruxnet-random-famous-quotes.p.mashape.com/cat=movies") 
     .header("X-Mashape-Key", config.mashapeKey) 
     .header("Content-Type", "application/x-www-form-urlencoded") 
     .header("Accept", "application/json") 
     .end(function (result) { 
     console.log(result.status); 
     // Handle errors 
     if(result.status != 200){ 
      promise.reject(result.body); 
     }else{ 
      var json = JSON.parse(result.body); 
      promise.resolve(json.quote); 
     } 
     }); 
     return promise; 
    }); 
+0

Это все равно дает мне тот же результат, к сожалению. – Jordan

+0

@Jordan вы изменили 'var Commands = require..'' var command'? 'command [0]. что бы не существовало в вашей области действия в вашем текущем коде. – azium

+0

'command [0] .whatever' исходит из другой функции вне этой области, я включил ссылку на полный файл' app.js' на github, чтобы вы могли видеть, я не хотел включать его, потому что я опасался, что он слишком длинный, и ему не нужно было представлять проблему. – Jordan

1

Ответ Роберта помог мне добраться до окончательного рабочего ответа. Мне нужно вернуть результат, но даже после попытки вернуть переменную обещания и сменив reject и resolve, чтобы удалить часть обещания перед ними (как упоминалось в комментариях к его ответу), я удалил переменную обещания все вместе и вернул весь обещаю себя как так

response: function(){ 
    var unirest = require('unirest'); 
    return new Promise(function(resolve, reject) { 
    unirest.post("https://andruxnet-random-famous-quotes.p.mashape.com/cat=movies") 
    .header("X-Mashape-Key", config.mashapeKey) 
    .header("Content-Type", "application/x-www-form-urlencoded") 
    .header("Accept", "application/json") 
    .end(function (result) { 
     console.log(result.status); 
     // Handle errors 
     if(result.status != 200){ 
     reject(result.body); 
     }else{ 
     var json = JSON.parse(result.body); 
     resolve(json.quote); 
     } 
    }); 
    }); 
}, 

 Смежные вопросы

  • Нет связанных вопросов^_^