Как я могу получить полное имя класса, если я знаю только его часть?

Обещания не являются обратными вызовами. Обещание представляет собой будущий результат асинхронной операции. Конечно, записывая их так, как вы, вы получаете небольшую выгоду. Но если вы напишете их так, как они предназначены для использования, вы можете написать асинхронный код так, чтобы он напоминал синхронный код, и его гораздо проще:

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
});

Конечно, не намного меньше кода , но гораздо более удобочитаемым.

Но это еще не конец. Давайте обнаружим истинные преимущества: что, если вы хотите проверить какую-либо ошибку на любом из шагов? Было бы чертовски сделать это с помощью обратных вызовов, но с обещаниями - кусок торта:

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
}).catch(function(error) {
     //handle any error that may occur before this point
});

Совсем так же, как блок try { ... } catch.

Еще лучше:

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
}).catch(function(error) {
     //handle any error that may occur before this point
}).then(function() {
     //do something whether there was an error or not
     //like hiding an spinner if you were performing an AJAX request.
});

И еще лучше: что делать, если эти 3 вызова api, api2, api3 могут выполняться одновременно (например, если они были AJAX звонки), но вам нужно было подождать три? Без обещаний вам нужно создать какой-то счетчик. С обещаниями, использующими нотацию ES6, это еще один кусок торта и довольно аккуратный:

Promise.all([api(), api2(), api3()]).then(function(result) {
    //do work. result is an array contains the values of the three fulfilled promises.
}).catch(function(error) {
    //handle the error. At least one of the promises rejected.
});

Надеюсь, вы увидите обещания в новом свете.

0
задан DenseCrab 5 March 2019 в 13:15
поделиться

3 ответа

попробуйте

 console.log( $(".anotherclass").attr("class").split(' '));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div  class="anotherclass my-class-no-1 onemoreclass"><div>

0
ответ дан Cristian Traìna 5 March 2019 в 13:15
поделиться

Вы можете использовать className и искать имя класса, содержащее вашу подстроку

let subclass = 'my-class-no-';

$('[class*="'+subclass+'"]').each(function() {
  let name = this.className.split(' ').find((className) => {
    return className.indexOf(subclass) !== -1;
  });

  console.log(name);
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="anotherclass my-class-no-1 onemoreclass">
  <div>

0
ответ дан R3tep 5 March 2019 в 13:15
поделиться

Я сделаю что-то подобное: (См. Комментарии в тексте)

var search = "my-class-no-"; // Added to enter the searched class only once
var elms = $("[class*=" + search + "]"); // Get match
var classstr = elms.attr("class"); // Get the class attribute

// Split the string class attribute string to only keep the class that was searched
var myClass = classstr.substring(classstr.indexOf(search)).split(" ")[0];
console.log(myClass);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="anotherclass my-class-no-1 onemoreclass"></div>

0
ответ дан Takit Isy 5 March 2019 в 13:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: