2014-11-18 5 views
1

У меня есть две функции,Функции Javascript Callback - Node.js

1) download(uri, filename, callback) -> Загрузка изображения в определенном месте
2) twitterPost(filename) -> Tweets изображение

Мне нужно это сделать Асинхронный - так я называю twitterPost после того, как изображение будет сделано загрузки, но я получаю эту ошибку каждый раз, когда:

throw new Error('File path does not exist: ' + media);                            
    ^                                        
Error: File path does not exist: Imgs/18478-wrt1114.jpg 

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

function download(uri, filename, callback) { 
    request.head(uri, function(err, res, body) { 
     request(uri).pipe(fs.createWriteStream(filename)).on('end', callback); 
    }); 
}; 

и

function twitterPost(filename) { 

    var twitterRestClient = new Twitter.RestClient(
     // API KEYS AND STUFF HERE 
    ); 

    twitterRestClient.statusesUpdateWithMedia(
     { 
      'status': 'Test Tweet', 
      'media[]': filename 
     }, 
     function(error, result) { 
      if (error) { console.log('Error: ' + error.message) } 

      if (result) { console.log(result.text) } 
    }); 
} 

Вот мой вызов функции:

download(image, filename,twitterPost(filename)); 

Могу ли я с помощью функции обратного вызова неправильно, или есть какой-то другой вопрос, который я я не замечаю причинения этой проблемы

Спасибо за помощь!

+0

Вы вызова функции перед вызовом 'download'. Это не обратный вызов, и он не является асинхронным - файл еще не существует. – Bergi

ответ

2

Могу ли я с помощью функции обратного вызова неправильно

Да, вы на самом деле не проходит обратного вызова функцию. Вы передаете результат немедленного вызова twitterPost(filename) - что происходит еще до того, как вызывается download, поэтому такого файла еще нет.

Используйте выражение функции вокруг этого вызова, чтобы получить эту функцию, названную по download:

download(image, filename, function(endEvent) { 
    twitterPost(filename); 
}); 
+0

Спасибо! Это решило проблему. Большое объяснение, спасибо за помощь –

-1

Я думаю, что ваша проблема связана с тем, как вы передаете аргументы своей функции.

download(image, filename,twitterPost(filename)); 

зарегистрируйтесь twitterPost(filename), чтобы ваше имя файла было таким, как ожидалось. Я почти уверен, что это не будет. Это потому, что ваша функция twitterPost не вызывается с этим аргументом. Он вызывается с:

request(uri).pipe(fs.createWriteStream(filename)).on('end', callback); 

Это не аргументы. Я хотел бы сделать:

request(uri).pipe(fs.createWriteStream(filename)).on('end', function(){ 
    callback(filename); 
}); 
Смежные вопросы