Здесь я попытался немного очистить код, чтобы его было легче читать. Как уже говорили другие, вам нужно определить обещание. В частности, вам нужно написать функцию, которая ВОЗВРАЩАЕТ a promise
. Если функция возвращает promise
, вы можете использовать .then
.
Помните, что вам также необходимо определить, к чему promise
приводит разрешение в успешном случае и в случае ошибки, или в случае отклонения.
Обещания MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
У меня не так много контекст, так что мне немного неясно, что вы будете resolve
и что вы будете reject
выполнять в своей checkFile
функции, но я постараюсь ниже дать предложение о том, как вы можете заставить его работать.
if (condition) {
try {
if (fs.existsSync(path)) {
playaudio();
} else {
checkfile().then(function(){
playaudio();
});
}
} catch (err) {
console.log(err);
}
}
function checkfile () {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav", function(response){
response.pipe(file);
});
}
} catch(err) {
console.error(err)
}
}
function playaudio() {
player.play('ring.wav', function(err){
if (err) throw err
})
}
Общий пример функции, которая возвращает обещание и его использование:
const somePromiseReturningFunction = function(someParameter) {
return new Promise(function(resolve, reject) {
if (someParameter === 'someDesiredString') {
resolve('Success!');
} else {
reject('Error!');
}
});
};
somePromiseReturningFunction('someDesiredString')
.then(function(resolvedValue) {
console.log(resolvedValue) // prints 'Success!'
})
.catch(function(error) {
console.log(error) // prints 'Error!'
});
checkFile переписан для возврата обещания:
function checkfile () {
return new Promise(function(resolve, reject) {
try {
if (!fs.existsSync(path)) {
var file = fs.createWriteStream("ring.wav");
var request = http.get("http://mp3.com/ring.wav", function(response){
response.pipe(file);
resolve();
});
}
} catch(err) {
reject(err)
}
});
}
Присоедините событие щелчка к документу для сокрытия отделения:
$(document).click(function(e) {
$('#somediv').hide();
});
Присоедините событие щелчка к отделению для остановки, нажимает на него от распространения до документа:
$('#somediv').click(function(e) {
e.stopPropagation();
});
Первая идея, в необработанном JavaScript (из этого сообщения):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<style type="text/css">
<!--
#mydiv{
background-color: #999999;
height: 100px;
width: 100px;
}
-->
</style>
<script type="text/javascript">
document.onclick=check;
function check(e)
{
var target = (e && e.target) || (event && event.srcElement);
var obj = document.getElementById('mydiv');
if(target!=obj){obj.style.display='none'}
}
</script>
</head>
<body>
<div id="mydiv">my div</div>
</body>
</html>
Протестированный с IE6 и FireFox3.1, это действительно работает, как рекламируется.
Это уверенный кажется на желание модального диалогового окна. Этот плагин jQuery http://code.google.com/p/simplemodal/ похож на него, имеет потенциал.
Если у отделения есть фокус, Вы могли бы присоединить к onblur событию.